#!/bin/bash

# SmartInput Mobile 应用启动脚本
# 使用构建后的dist目录启动应用

set -e

# 配置变量
APP_NAME="smartinput-mobile"
DIST_DIR="dist"
PORT=${PORT:-3003}
HOST=${HOST:-"0.0.0.0"}

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查dist目录是否存在
check_dist() {
    if [[ ! -d "$DIST_DIR" ]]; then
        log_error "dist目录不存在，请先构建应用"
        log_info "运行以下命令构建应用："
        log_info "  npm run build  # 或 pnpm run build"
        exit 1
    fi
    
    if [[ ! -f "$DIST_DIR/index.html" ]]; then
        log_error "dist目录中缺少index.html文件，构建可能不完整"
        exit 1
    fi
    
    log_success "dist目录检查通过"
}

# 检查依赖
check_dependencies() {
    # 检查是否有serve或http-server
    if command -v serve &> /dev/null; then
        SERVER_CMD="serve"
        log_info "使用serve启动应用"
    elif command -v http-server &> /dev/null; then
        SERVER_CMD="http-server"
        log_info "使用http-server启动应用"
    elif command -v python3 &> /dev/null; then
        SERVER_CMD="python3"
        log_info "使用Python3启动应用"
    elif command -v python &> /dev/null; then
        SERVER_CMD="python"
        log_info "使用Python启动应用"
    else
        log_error "未找到可用的静态文件服务器"
        log_info "请安装以下任一工具："
        log_info "  npm install -g serve"
        log_info "  npm install -g http-server"
        log_info "  或确保Python已安装"
        exit 1
    fi
}

# 使用serve启动
start_with_serve() {
    log_info "使用serve启动应用..."
    serve -s "$DIST_DIR" -l "$PORT" -n "$APP_NAME"
}

# 使用http-server启动
start_with_http_server() {
    log_info "使用http-server启动应用..."
    http-server "$DIST_DIR" -p "$PORT" -a "$HOST" -c-1 --cors
}

# 使用Python启动
start_with_python() {
    log_info "使用Python启动应用..."
    cd "$DIST_DIR"
    
    if [[ "$SERVER_CMD" == "python3" ]]; then
        python3 -m http.server "$PORT" --bind "$HOST"
    else
        python -m http.server "$PORT" --bind "$HOST"
    fi
}

# 启动应用
start_app() {
    case "$SERVER_CMD" in
        "serve")
            start_with_serve
            ;;
        "http-server")
            start_with_http_server
            ;;
        "python3"|"python")
            start_with_python
            ;;
        *)
            log_error "未知的服务器类型: $SERVER_CMD"
            exit 1
            ;;
    esac
}

# 显示帮助信息
show_help() {
    echo "SmartInput Mobile 应用启动脚本"
    echo ""
    echo "用法: $0 [选项]"
    echo ""
    echo "选项:"
    echo "  -p, --port PORT    指定端口号 (默认: 3003)"
    echo "  -h, --host HOST    指定主机地址 (默认: 0.0.0.0)"
    echo "  -b, --build        启动前先构建应用"
    echo "  --help             显示此帮助信息"
    echo ""
    echo "环境变量:"
    echo "  PORT                端口号"
    echo "  HOST                主机地址"
    echo ""
    echo "示例:"
    echo "  $0                    # 使用默认配置启动"
    echo "  $0 -p 8080          # 在端口8080启动"
    echo "  $0 -h 127.0.0.1     # 只允许本地访问"
    echo "  $0 -b                # 构建后启动"
}

# 构建应用
build_app() {
    log_info "构建应用..."
    
    if command -v pnpm &> /dev/null; then
        pnpm run build
    else
        npm run build
    fi
    
    if [[ $? -eq 0 ]]; then
        log_success "应用构建成功"
    else
        log_error "应用构建失败"
        exit 1
    fi
}

# 解析命令行参数
parse_args() {
    while [[ $# -gt 0 ]]; do
        case $1 in
            -p|--port)
                PORT="$2"
                shift 2
                ;;
            -h|--host)
                HOST="$2"
                shift 2
                ;;
            -b|--build)
                BUILD_BEFORE_START=true
                shift
                ;;
            --help)
                show_help
                exit 0
                ;;
            *)
                log_error "未知参数: $1"
                show_help
                exit 1
                ;;
        esac
    done
}

# 主函数
main() {
    log_info "启动SmartInput Mobile应用..."
    
    # 解析命令行参数
    parse_args "$@"
    
    # 如果需要构建
    if [[ "$BUILD_BEFORE_START" == true ]]; then
        build_app
    fi
    
    # 检查dist目录
    check_dist
    
    # 检查依赖
    check_dependencies
    
    # 显示启动信息
    log_info "应用信息："
    log_info "  名称: $APP_NAME"
    log_info "  端口: $PORT"
    log_info "  主机: $HOST"
    log_info "  目录: $DIST_DIR"
    log_info ""
    log_info "启动应用..."
    
    # 启动应用
    start_app
}

# 运行主函数
main "$@"
